package com.ynet.middleground.user.service;

import java.util.List;

import javax.validation.Valid;

import com.ynet.core.common.BaseReqObj;
import com.ynet.core.common.ServiceResult;
import com.ynet.middleground.user.bean.*;
import com.ynet.middleground.user.dto.EsignAccountInfoDTO;
import com.ynet.middleground.user.dto.EsignValidDetailDTO;
import com.ynet.middleground.user.dto.IndividualFaceDTO;
import com.ynet.middleground.user.dto.SubbranchDto;

/**
 * @author liulx
 * @description E签宝服务接口
 * @date 2019-11-06 23:33
 */
public interface EsignService {

    /**
     * 创建E签宝个人账户
     *
     * @param createEsignPersonReq 创建E签宝个人账户请求对象
     * @return 个人客户账户号 AccountId
     * @author liulx
     */
    ServiceResult<String> addPersonAccount(@Valid CreateEsignPersonReq createEsignPersonReq);

    /**
     * 创建E签宝企业账户
     *
     * @param createEsignOrganizeReq 创建E签宝企业账户请求对象
     * @return 企业客户账户号 AccountId
     * @author liulx
     */
    ServiceResult<String> addOrganizeAccount(@Valid CreateEsignOrganizeReq createEsignOrganizeReq);

    /**
     * 根据证件号获取账户信息
     *
     * @param infoReq 查询E签宝账户信息请求对象
     * @return E签宝用户信息传输对象
     * @author liulx
     */
    ServiceResult<EsignAccountInfoDTO> getAccountInfoByIdNo(@Valid QueryEsignAccountInfoReq infoReq);

    /**
     * 更新E签宝个人账户信息
     *
     * @param req 更新E签宝个人账户请求对象
     * @return 更新结果以 success 字段值标识 true/false
     */
    ServiceResult updatePersonAccount(@Valid UpdateEsignPersonReq req);

    /**
     * 更新E签宝企业账户信息
     *
     * @param req 更新E签宝企业账户请求对象
     * @return 更新结果以 success 字段值标识 true/false
     */
    ServiceResult updateOrganizeAccount(@Valid UpdateEsignOrganizeReq req);

    /**
     * 注销E签宝账户
     *
     * @param req 注销E签宝账户请求对象
     * @return 注销结果以 success 字段值标识 true/false
     */
    ServiceResult deleteAccount(@Valid DeleteEsignAccountReq req);

    /**
     * 【人脸识别认证】个人核身 API 版
     *
     * @param req 获取个人人脸核身认证地址请求信息
     * @return 个人人脸核身地址信息
     */
    ServiceResult<IndividualFaceDTO> getIndividualFace(@Valid GetIndividualFaceReq req);

    /* add by 2019年11月7日, PM 06:29:51 DaiGaoLe begin */
    /**
     * @Description: 个人三要素认证
     * @Param:
     * @return:
     * @Author: DaiGaoLe
     * @Date: 2019/11/7
     */
    public ServiceResult<String>
        personsServiceProviderThreeFactorVerification(@Valid PersonsThreeFactorReq requestObject);

    /**
     * @Description: 个人银行卡4要素信息比对
     * @Param:
     * @return:
     * @Author: DaiGaoLe
     * @Date: 2019/11/7
     */
    public ServiceResult<String> bank4FactorsVerification(@Valid Bank4FactorsReq requestObject);

    /**
     * @Description: 企业4要素信息比对
     * @Param:
     * @return:
     * @Author: DaiGaoLe
     * @Date: 2019/11/7
     */
    public ServiceResult<String> bureau4FactorsVerification(@Valid Bureau4FactorsReq requestObject);

    /**
     * @Description: 企业2要素信息比对
     * @Param:
     * @return:
     * @Author: syf
     * @Date: 2022/04/19
     */
    public ServiceResult<String> bureau2FactorsVerification(@Valid Bureau2FactorsReq requestObject);

    /**
     * @Description: 发起企业实名认证4要素校验
     * @Param:
     * @return:
     * @Author: DaiGaoLe
     * @Date: 2019/11/13
     */
    public ServiceResult<String> enterpriseCertificationFourFactorVerification(
        @Valid EnterpriseCertification4FactorVerificationReq requestObject);

    /**
     * @Description: 发起随机金额打款认证
     * @Param:
     * @return:
     * @Author: DaiGaoLe
     * @Date: 2019/11/13
     */
    public ServiceResult<String> transferRandomAmount(@Valid TransferRandomAmountReq requestObject);

    /**
     * @Description: 随机打款金额校验
     * @Param:
     * @return:
     * @Author: DaiGaoLe
     * @Date: 2019/11/13
     */
    public ServiceResult<String> verifyRandomAmountReq(@Valid VerifyRandomAmountReq requestObject);

    /**
     * @Description: 查询打款银行信息
     * @Param:
     * @return:
     * @Author: DaiGaoLe
     * @Date: 2019/11/13
     */
    public ServiceResult<List<SubbranchDto>> subbranch(@Valid SubbranchReq requestObject);

    /* add by 2019年11月7日, PM 06:29:51 DaiGaoLe end */

    /**
     * 个人 2 要素比对
     *
     * @param req 个人 2 要素比对请求对象
     * @return 信息比对业务 id
     * @author liulx
     */
    ServiceResult<String> individualVerifyBase(@Valid ValidPersonBaseReq req);

    /**
     * 发起运营商3要素核身认证
     * 
     * @param reqObj 运营商3要素核身认证请求对象
     * @return 认证flowId
     * @author liulx
     */
    ServiceResult<String> validTelecom3Factors(@Valid ValidPersonTelecom3Req reqObj);

    /**
     * 发起银行卡4要素核身认证
     * 
     * @param reqObj 银行卡4要素核身认证请求对象
     * @return 认证flowId
     * @author liulx
     */
    ServiceResult<String> validBankCard4Factors(@Valid ValidPersonBankCard4Req reqObj);

    /**
     * 查询认证信息
     *
     * @param reqObj 查询认证信息请求对象
     * @return 认证flowId
     * @author liulx
     */
    ServiceResult<EsignValidDetailDTO> getValidDetail(@Valid QueryEsignValidDetailReq reqObj);

    /**
     * 运营商三要素短信验证码校验
     * 
     * @param req e签宝手机验证码校验请求对象
     * @return 校验结果 success 字段值标识 true/false
     */
    ServiceResult checkCodeByTelecom3Factors(@Valid CheckEsignVerificationCodeReq req);

    /**
     * 银行预留手机号验证码校验
     * 
     * @param req e签宝手机验证码校验请求对象
     * @return 校验结果 success 字段值标识 true/false
     */
    ServiceResult checkCodeByBankCard4Factors(@Valid CheckEsignVerificationCodeReq req);

    /**
     * 获取中台使用e签宝token
     * 
     * @param req
     * @return
     */
    ServiceResult getEsignToken(@Valid BaseReqObj req);

}
